package homework;

public class Test02 {
    //1. 编写两个线程,一个线程打印1-52的整数，另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印，并且每打印两个整数后，打印一个字母，交替循环打印，直到打印到整数52和字母Z结束。
    //要求：
    //1)编写打印类Printer，声明私有属性index，初始值为1，用来表示是第几次打印。
    //2)在打印类Printer中编写打印数字的方法print(int i)，3的倍数就使用wait()方法等待，否则就输出i，使用notifyAll()进行唤醒其它线程。
    //3)在打印类Printer中编写打印字母的方法print(char c)，不是3的倍数就等待，否则就打印输出字母c，使用notifyAll()进行唤醒其它线程。
    //4)编写打印数字的线程NumberPrinter继承Thread类，声明私有属性private Printer p;在构造方法中进行赋值，实现父类的run方法，调用Printer类中的输出数字的方法。
    //5)编写打印字母的线程LetterPrinter继承Thread类，声明私有属性private Printer p;在构造方法中进行赋值，实现父类的run方法，调用Printer类中的输出字母的方法。
    //6)编写测试类Test，创建打印类对象，创建两个线程类对象，启动线程。

    public static void main(String[] args) {
        Printer p = new Printer();//创建打印类对象
        Thread t1 = new Thread(new NumberPrinter(p));
        Thread t2 = new Thread(new LetterPrinter(p));
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("index:" + p.getIndex());
    }
    //创建打印数字的线程
    private static class NumberPrinter implements Runnable {
        private Printer p;

        public NumberPrinter(Printer p) {
            this.p = p;
        }

        @Override
        public void run() {
            for (int i = 1; i < 53; i++) {
                p.print(i);
            }
        }
    }
    //创建打印字母的线程
    private static class LetterPrinter implements Runnable {
        private Printer p;
        public LetterPrinter(Printer p){
            this.p = p;
        }
        @Override
        public void run() {
            char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
            for (char letter : letters) {
                p.print(letter);
            }

        }
    }
}

class Printer{
//1)编写打印类Printer，声明私有属性index，初始值为1，用来表示是第几次打印。
    private int index = 1;

    //2)在打印类Printer中编写打印数字的方法print(int i)，3的倍数就使用wait()方法等待，否则就输出i，使用notifyAll()进行唤醒其它线程。
    public synchronized void print(int i){
        while(index % 3 == 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(" "+i);
        index++;
        notifyAll();
    }
    //3)在打印类Printer中编写打印字母的方法print(char c)，不是3的倍数就等待，否则就打印输出字母c，使用notifyAll()进行唤醒其它线程。
    public synchronized void print(char c){

        while(index % 3 != 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(" "+c+"\n");
        index++;
        notifyAll();
    }
    public int getIndex(){
        return index;
    }
}